﻿/**
 * Copyright "Nobic38"
 * contributeur : "G. Qyy"
 * (06/2010) 
 * 
 * alienscorp9@gmail.com
 * 
 * Ce logiciel est un programme informatique servant à démontrer l'usage des différentes possibilité de C#. 
 * 
 * Ce logiciel est régi par la licence CeCILL-B soumise au droit français et
 * respectant les principes de diffusion des logiciels libres. Vous pouvez
 * utiliser, modifier et/ou redistribuer ce programme sous les conditions
 * de la licence CeCILL-B telle que diffusée par le CEA, le CNRS et l'INRIA 
 * sur le site "http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt".
 * 
 * En contrepartie de l'accessibilité au code source et des droits de copie,
 * de modification et de redistribution accordés par cette licence, il n'est
 * offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons,
 * seule une responsabilité restreinte pèse sur l'auteur du programme,  le
 * titulaire des droits patrimoniaux et les concédants successifs.
 * 
 * A cet égard  l'attention de l'utilisateur est attirée sur les risques
 * associés au chargement,  à l'utilisation,  à la modification et/ou au
 * développement et à la reproduction du logiciel par l'utilisateur étant 
 * donné sa spécificité de logiciel libre, qui peut le rendre complexe à 
 * manipuler et qui le réserve donc à des développeurs et des professionnels
 * avertis possédant  des  connaissances  informatiques approfondies.  Les
 * utilisateurs sont donc invités à charger  et  tester  l'adéquation  du
 * logiciel à leurs besoins dans des conditions permettant d'assurer la
 * sécurité de leurs systèmes et ou de leurs données et, plus généralement, 
 * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. 
 * 
 * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez 
 * pris connaissance de la licence CeCILL-B, et que vous en avez accepté les
 * termes.
 **/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using GestionComptes.Serialize;

namespace GestionComptes.Class
{
    [Serializable]
    public class Compte
    {
        // BindingList<T> plutot que List<T> pour pouvoir binder automatiquement
        // Dans le DataGridView
        // DOC: http://stackoverflow.com/questions/930069/datagridview-causing-indexoutofrangeexception-when-clicked-upon
        private MyBindingList<Ecriture> ecritures = new MyBindingList<Ecriture>();

        private String nomCompte;

        // DOC: Surcharge d'opérateur - http://msdn.microsoft.com/fr-fr/library/ms228498.aspx
        // Par exemple ici on surcharge le constructeur
        #region Constructeurs

        /// <summary>
        /// Crée l'objet Compte
        /// </summary>
        /// <param name="nomCompte">Nom du compte (il ne faut pas qu'il soit vide)</param>
        public Compte(String nomCompte)
        {
            this.NomCompte = nomCompte;
        }

        /// <summary>
        /// Crée l'objet compte en définissant le nom de la banque qui gère le compte
        /// </summary>
        /// <param name="nomCompte">Nom du compte (il ne faut pas qu'il soit vide)</param>
        /// <param name="nomBanque">La banque qui gère le compte</param>
        public Compte(String nomCompte, Banque laBanque)
        {
            LaBanque = laBanque;
        }

        #endregion

        #region Propriétés

        /// <summary>
        /// La banque qui gère le compte
        /// </summary>
        [Category("Informations"), Description("Le nom de la banque qui gère le compte")]
        public Banque LaBanque
        {
            get;
            set;
        }

        /// <summary>
        /// Liste de toute les écritures
        /// </summary>
        [Category("Contenu"), Description("Liste de toute les écritures"), ReadOnly(true)]
        public MyBindingList<Ecriture> Ecritures
        {
            get
            {
                return this.ecritures;
            }
        }

        // DOC: LINQ - http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx
        /// <summary>
        /// Liste des crédits
        /// </summary>
        [Category("Contenu"), Description("Liste des crédits"), ReadOnly(true)]
        public MyBindingList<Credit> Credits
        {
            get
            {
                MyBindingList<Credit> retour = new MyBindingList<Credit>();

                var credits = from credit in this.ecritures
                              where credit.TypeEcriture == Ecriture.TypesEcritureEnum.Credit
                              select (Credit)credit;

                foreach (Credit credit in credits)
                {
                    retour.Add(credit);
                }

                return retour;
            }
        }

        /// <summary>
        /// Liste des débits
        /// </summary>
        [Category("Contenu"), Description("Liste des débits"), ReadOnly(true)]
        public MyBindingList<Debit> Debits
        {
            get
            {
                MyBindingList<Debit> retour = new MyBindingList<Debit>();

                var debits = from debit in this.ecritures
                             where debit.TypeEcriture == Ecriture.TypesEcritureEnum.Debit
                             select (Debit)debit;

                foreach (Debit debit in debits)
                {
                    retour.Add(debit);
                }

                return retour;
            }
        }

        /// <summary>
        /// Nom du compte (il ne faut pas qu'il soit vide)
        /// </summary>
        [Category("Informations"), Description("Nom du compte")]
        public String NomCompte
        {
            get
            {
                return nomCompte;
            }
            set
            {
                if (String.IsNullOrEmpty(value))
                {
                    // DOC : Création et levée d'exceptions - http://msdn.microsoft.com/fr-fr/library/ms173163.aspx
                    throw new ArgumentNullException("Le nom du compte ne peut pas être vide");
                }
                else
                {
                    this.nomCompte = value;
                }
            }
        }


        #endregion

        #region Methodes

        /// <summary>
        /// Ajoute une écriture à la liste des écritures
        /// </summary>
        /// <param name="credit">Un objet Ecriture</param>
        public void AjouteEcriture(Ecriture ecriture)
        {
            this.ecritures.Add(ecriture);
        }

        /// <summary>
        /// Cette fonction est trop cool parce qu'elle sert à faire tout les calcul compliqué !
        /// </summary>
        public void MaFonctionDeRoxxor()
        {
            // TODO: MaFonctionDeRoxxor : Faut vraiment y penser
            throw new NotImplementedException("MaFonctionDeRoxxor : Putain, je suis un branleure, je m'en suis toutjous pas occupé !");
        }

        public override string ToString()
        {
            return NomCompte;
        }

        #endregion
    }
}
